mybatis + 首页开发

起因

  1. 其实这个看了半天也不没啥可说的,就是些零零散散的配置,不过还是记录一下吧;况且只是稍微会用,可不能称之为会用啊;

mybatis

  • 这货是java的一个持久化框架;我这里用的是mybatis-spring-boot-starter 不知道和只使用mybatis有啥区别不;
    1
    2
    3
    4
    spring.datasource.url=jdbc:mysql://localhost:3306/wenda
    spring.datasource.data-username=root
    spring.datasource.data-password=86271325
    mybatis.config-location=classpath:mybatis-config.xml
  • 让我们先看看java的项目架构
    首先是 mvc,实体+控制类+页面; 数据又需要从数据库中来,所以控制类还要持有服务类,服务类又要持有DAO类;这样整体的架构就出来了;

  • DAO + Mybatis

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    @Mapper
    @Component
    public interface QuestionDAO {
    String TABLE_NAME = " question ";
    String INSERT_FIELDS = " title, content, created_date, user_id, comment_count ";
    String SELECT_FIELDS = " id, " + INSERT_FIELDS;
    /**
    * 通过mybatis 的注解书写的DAO,减少了许多代码<br>
    * 一定要注意string之间的空格,通过#{}的方式可以直接取得对象中的属性<br>
    * 一定要注意#{}内是字段名字
    * @param question 问题对象
    * @return int
    */
    @Insert({"insert into ", TABLE_NAME, "(", INSERT_FIELDS,
    ") values (#{title},#{content},#{createdDate},#{userId},#{commentCount})"})
    int addQuestion(Question question);
    /**
    * 这个不是通过注解的方式,而是通过xml来实现的<br>
    * Param注解 表示需要传过去的参数,真正的sql语句在xml中定义
    * @param userId 用户Id
    * @param offset 开始位置
    * @param limit 限制
    * @return
    */
    List<Question> selectLatestQuestions(@Param("userId") int userId, @Param("offset") int offset,
    @Param("limit") int limit);
    }
  • 基于xml的数据库操作
    一定要将xml放在resource的同包中

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    <mapper namespace="cn.colining.dao.QuestionDAO">
    <sql id="table">question</sql>
    <sql id="selectFields">id, title, content, comment_count,created_date,user_id
    </sql>
    <select id="selectLatestQuestions" resultType="cn.colining.model.Question">
    SELECT
    <include refid="selectFields"/>
    FROM
    <include refid="table"/>
    <if test="userId != 0">
    WHERE user_id = #{userId}
    </if>
    ORDER BY id DESC
    LIMIT #{offset},#{limit}
    </select>
    </mapper>

ViewObject

  • 这个其实就是为了方便传值,所以model添加对象时,只需要将viewobject整个扔进去就行了
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    /**
    * 通过model 将vos 传递给页面,进行首页展示
    * @param model model
    * @return 页面
    */
    @RequestMapping(path = {"/", "/index"}, method = {RequestMethod.GET})
    public String index(Model model) {
    List<ViewObject> vos = getViewObjects(0,0,10);
    model.addAttribute("vos", vos);
    return "index";
    }

freemarker 日期

我们可以通过下面这种方式从freemarker中获取对象

1
${vo.user.id}

日期有点搞怪,因为定义是util的日期类,所以需要声明格式才行

1
${vo.question.createDate?string("yyyy-MM-dd HH:mm")}